package com.eclink.iot.tcp.virtualdevice.message;

import java.util.ArrayList;
import java.util.List;

public abstract class Message {

    public abstract byte getCode();

    public abstract List<Byte> getDataBytes();

    public List<Byte> getMainBytes(){
        List<Byte> data = this.getDataBytes();
        int dataLength = data.size();

        // 前置4个字节
        // 第一位命令类型
        // 第二位命令码
        // 第三第四 数据长度
        byte[] prev = new byte[] { 0, this.getCode(), 0, (byte) dataLength };

        List<Byte> mainBlock = new ArrayList<>();
        for(byte b : prev){
            mainBlock.add(b);
        }
        mainBlock.addAll(data);
        return mainBlock;
    }



    public List<Byte> getBytes() {
        byte startFlag = (byte) 170;
        byte endFlag = (byte) 221;

        List<Byte> mainBlock = getMainBytes();

        byte crc = 0;
        for(byte b : mainBlock) {
            crc += b;
        }

        List<Byte> message= new ArrayList<>();
        message.add(startFlag);
        message.addAll(mainBlock);
        message.add(crc);
        message.add(endFlag);

        return message;
    }

}
